package br.com.websec.titulo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;

import br.com.websec.agencia.Agencia;
import br.com.websec.endereco.Endereco;
import br.com.websec.fornecedor.Fornecedor;


public class TituloDaoHibernate implements TituloDao {

	private static final Logger logger = Logger
			.getLogger(TituloDaoHibernate.class.getName());
	private Session session;

	public void setSession(Session session) {
		this.session = session;
	}

	@Override
	public void salvar(Titulo titulo) {

		try {
			this.session.save(titulo);

		} catch (Exception e) {
			logger.error("Não foi possível salvar objeto Titulo na base.: "
					+ e.getMessage());

		}

	}

	@Override
	public void excluir(Titulo titulo) {
		try {
			this.session.delete(titulo);

		} catch (Exception e) {
			logger.error("Não foi possível excluir objeto Titulo da base.: "
					+ e.getMessage());

		}

	}

	@Override
	public Titulo buscarPorId(Integer titulo) {
		
		String hql = "select t from Titulo  t where t.idTitulo = :idtitulo";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("idtitulo", titulo);
		return (Titulo) query.uniqueResult();
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public List<Titulo> buscarPorCliente(Integer cliente) {
		
		
		List<Titulo> listaTitulo = new ArrayList<Titulo>();
		String hql = "select t from Titulo  t where t.cliente = :idcliente";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("idcliente", cliente);
		listaTitulo = query.list();
		return listaTitulo;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Titulo> listar() {
		
		
		return this.session.createCriteria(Titulo.class).list();
	}

	@SuppressWarnings("unchecked")
	public List<Titulo> buscarPorBanco(Integer banco) {
		List<Titulo> listaTitulo = new ArrayList<Titulo>();
		String hql = "select t from Titulo  t where t.cliente = :idbanco";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("idbanco", banco);
		listaTitulo = query.list();
		return listaTitulo;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Titulo> consultarPorDiasVencidos(Date dias) {
		List<Titulo> listaTitulo = new ArrayList<Titulo>();		
//		String sql = "select t from Titulo  t where t.dtVencimento < :dias";
//		Query query = (Query) this.session.createSQLQuery(sql);
//		((org.hibernate.Query) query).setDate("dtVencimento", dias);
//		listaTitulo = ((Criteria) query).list();
		return listaTitulo;
	}

	@Override
	public List<Titulo> buscarPorFornecedor(Integer fornecedor) {
		
		List<Titulo> listaTitulo = new ArrayList<Titulo>();
		String hql = "select t from Titulo  t where t.fornecedor.idFornecedor = :idfornecedor";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("idfornecedor", fornecedor);
		listaTitulo = query.list();
		return listaTitulo;

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Titulo> buscarPorStatusPendente(Integer fornecedor) {
		
		List<Titulo> listaTitulo = new ArrayList<Titulo>();
		String hql = "select t from Titulo  t  where t.fornecedor.idFornecedor = :id";
		session.beginTransaction();
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("id", fornecedor);
		listaTitulo = query.list();
		session.beginTransaction().commit();
		return listaTitulo;
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Titulo> buscarPorDataVencimento(Date dataVencimento) {
		
		List<Titulo> listaTitulo = new ArrayList<Titulo>();
		String hql = "select t from Titulo  t where t.dtVencimento <= :dataVencimento";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("dataVencimento", dataVencimento);
		listaTitulo = query.list();
		return listaTitulo;

		
	}

	@Override
	public Titulo buscarPorFornecedor(String numero, Integer fornecedor) {

		String hql = "select e from Titulo  e where e.fornecedor.idFornecedor = :idfornecedor and e.identificacaoTituloEmpresa = :numero";
		org.hibernate.Query query = this.session.createQuery(hql);
		query.setParameter("idfornecedor", fornecedor);
		query.setParameter("numero", numero);
		return (Titulo) query.uniqueResult();

	}

}
